#!/bin/bash
# EbbFlow 测试脚本 - n=6, batchsize=1000, R=5
set -e

# 颜色定义
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
NC='\033[0m'

# 配置参数
N_NODES=6
BATCH_SIZE=1000
R=5
EPOCHS=30
FAULTY_NODES=1
PROJECT_ROOT="/home/ebbflow"
LOG_DIR="${PROJECT_ROOT}/logs_test"
BINARY="${PROJECT_ROOT}/ebbflow_server"

log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_step() {
    echo -e "${BLUE}==>${NC} ${GREEN}$1${NC}"
}

# 停止函数
stop_nodes() {
    log_step "停止所有节点..."
    pkill -f ebbflow_server 2>/dev/null || true
    sleep 1
    log_info "所有节点已停止"
}

# 清理函数
cleanup() {
    stop_nodes
}

# 编译
build() {
    log_step "编译 EbbFlow 服务器..."
    cd "$PROJECT_ROOT"
    go build -o "$BINARY" ./src/main/ebbflow_server.go
    if [ $? -ne 0 ]; then
        echo "编译失败"
        exit 1
    fi
    log_info "编译成功: $BINARY"
}

# 创建日志目录
mkdir -p "$LOG_DIR"

# 清理旧进程
cleanup

# 编译
build

# 启动节点
log_step "启动 $N_NODES 个节点 (batchsize=$BATCH_SIZE, R=$R, epochs=$EPOCHS)..."

for i in $(seq 0 $(($N_NODES-1))); do
    log_info "启动节点 $i..."
    $BINARY -id $i -n $N_NODES -f $FAULTY_NODES -batch $BATCH_SIZE -r $R -epochs $EPOCHS -v > "$LOG_DIR/node_$i.log" 2>&1 &
    sleep 0.5
done

log_info "所有节点已启动"
log_info "日志文件位于: $LOG_DIR"
log_info "使用以下命令查看日志:"
echo "  tail -f $LOG_DIR/node_0.log"
echo ""
log_info "等待测试完成..."
echo "按 Ctrl+C 停止所有节点"

# 等待用户中断
trap 'cleanup; exit' INT TERM

# 计算预计运行时间（epochs * 每个epoch约0.1秒，加上一些缓冲）
ESTIMATED_TIME=$(($EPOCHS * 2 + 10))
log_step "测试运行中（预计需要约 $ESTIMATED_TIME 秒）..."
log_info "使用以下命令查看实时日志:"
echo "  tail -f $LOG_DIR/node_0.log"
echo "  watch -n 1 'tail -20 $LOG_DIR/node_0.log'"
echo ""

# 等待测试完成
sleep $ESTIMATED_TIME

log_step "测试完成，查看结果..."
log_info "最后10行日志（节点0）:"
tail -10 "$LOG_DIR/node_0.log" 2>/dev/null || echo "日志文件未找到"

log_info "测试统计（所有节点）:"
grep -h "Turritopsis Integration Statistics" "$LOG_DIR"/node_*.log 2>/dev/null | head -1 || echo "未找到统计信息"

log_info ""
log_info "完整日志文件位于: $LOG_DIR"
log_info "运行 './test_ebbflow.sh stop' 停止所有节点"

# 检查是否有stop参数
if [ "$1" = "stop" ]; then
    stop_nodes
    exit 0
fi

# 保持脚本运行以便查看结果
wait

